Amazon Aurora DSQLのUser Guideに沿ってNode.jsで基本的な操作を試してみた
はじめに
AWS re:Invent2024にて、新サービス「Amazon Aurora DSQL」が発表されました。
初めて利用するので、ユーザーガイドに沿ってAmazon Aurora DSQLのリソース作成を行い、Lambda(Node.js)で基本的な操作をするところまで記事にしてみようと思います。
同じように「とりあえず動かしてみようかな」という方の参考になれば幸いです!
クラスターを作成する
ユーザーガイドに沿ってクラスターを作成していきます。
マネジメントコンソールに入り、バージニア北部リージョンに切り替えてクラスターを作成します。
デフォルト設定のまま、クラスターを作成します。
作成完了までしばらくかかります。
これでクラスター作成の作業は完了です。
実装の紹介
今回のコードはGitHubで公開しています。
Lambdaの実装(Typescript)
ユーザーガイドに沿って、実装を行います。
※今回はAWS CDKで構築しましたが、Lambdaを手動で作成してコーディングでも問題ありません。
ユーザーガイドに沿って実装しましたが、少し修正しているところもあります。コメントで紹介していきます。
import { DsqlSigner } from "@aws-sdk/dsql-signer";
import { Client } from "pg"; // ⭐️インポートの方法を修正しました
let client: Client; // ⭐️clientを使い回すためにhandler外に出しました
export async function handler() {
const region = "us-east-1";
try {
const CLUSTER_ENDPOINT = process.env.CLUSTER_ENDPOINT || ''; // ⭐️Lambdaの環境変数にエンドポイントを設定するように修正しました
// The token expiration time is optional, and the default value 900 seconds
const signer = new DsqlSigner({
hostname: CLUSTER_ENDPOINT,
region,
});
const token = await signer.getDbConnectAdminAuthToken();
client = new Client({
host: CLUSTER_ENDPOINT,
user: "admin",
password: token,
database: "postgres",
port: 5432,
// <https://node-postgres.com/announcements> for version 8.0
ssl: true
});
// Connect
await client.connect();
// Create a new table
await client.query(`CREATE TABLE IF NOT EXISTS owner (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(30) NOT NULL,
city VARCHAR(80) NOT NULL,
telephone VARCHAR(20)
)`);
// Insert some data
await client.query("INSERT INTO owner(name, city, telephone) VALUES($1, $2, $3)",
["John Doe", "Anytown", "555-555-1900"]
);
// Check that data is inserted by reading it back
const result = await client.query("SELECT id, city FROM owner where name='John Doe'");
console.log({id: result.rows[0].id}); // ⭐️確認のためログを出しています
await client.query("DELETE FROM owner where name='John Doe'");
const deletedResult = await client.query("SELECT id, city FROM owner where name='John Doe'");
console.log({deletedResult}); // ⭐️確認のためログを出しています
} catch (error) {
console.error(error);
throw error
} finally {
client?.end()
}
Promise.resolve()
}
インフラの実装(AWS CDK)
CDKのコードを紹介します。
import * as cdk from 'aws-cdk-lib';
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
import * as iam from 'aws-cdk-lib/aws-iam';
import { Construct } from 'constructs';
export class DsqlNodePostgresStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// NOTE: DSQL Clusterは手動で別途定義している
// Lambda -> DSQLのIAMロールを作成
const role = new iam.Role(this, 'DsqlSampleRole', {
assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
});
// 本番運用の際は権限を絞る
role.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonAuroraDSQLFullAccess'));
// Lambdaを定義
new NodejsFunction(this, 'DsqlSampleFunction', {
entry: 'lambda/handler.ts',
environment: {
CLUSTER_ENDPOINT: "<INSERT_YOUR_ENDPOINT>"
}
});
}
}
// Lambda -> DSQLのIAMロールを作成
const role = new iam.Role(this, 'DsqlSampleRole', {
assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
});
role.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonAuroraDSQLFullAccess'));
DSQLクラスターへの権限が必要なので、IAMロールを定義してLambdaに付与しています。
実行結果
以下のようにログが出力されています。
SELECT, INSERT, DELETEの処理が問題なく実行できていることが無事に確認できました。
感想
簡単ではありますが、新サービス Aurora DSQLの動作を確認してみました。
やっぱり、新サービスを実際に触ってみるのは楽しいですね。
今回の検証を糧に、応用的な検証もしていきたいと思います!